/**
 * 消息气泡处理工具
 */

/**
 * 处理红包点击
 * @param {string} redPacketId 红包ID
 * @param {string} redPacketType 红包类型
 * @param {Function} apiHandler API处理函数
 * @param {Object} utils 工具函数对象
 * @returns {Promise<void>}
 */
export const handleRedPacketClick = async (
  redPacketId,
  redPacketType,
  apiHandler,
  utils
) => {
  if (!redPacketId) return;

  const { showLoading, hideLoading, showError } = utils;

  try {
    showLoading("领取红包中...");

    // 猜拳红包需要额外参数
    if (redPacketType === "rockPaperScissors") {
      hideLoading();

      uni.showActionSheet({
        itemList: ["石头", "剪刀", "布"],
        success: async (res) => {
          const gestures = ["0", "1", "2"];
          const gesture = gestures[res.tapIndex];

          try {
            showLoading("猜拳中...");
            const result = await apiHandler(redPacketId, gesture);
            hideLoading();

            uni.navigateTo({
              url: `/pages/chat/red-packet-detail?id=${redPacketId}&type=${redPacketType}&data=${encodeURIComponent(
                JSON.stringify(result)
              )}`,
            });
          } catch (error) {
            hideLoading();
            showError("领取失败: " + (error.message || "未知错误"));
          }
        },
      });
      return;
    }

    // 领取普通红包
    const result = await apiHandler(redPacketId);
    hideLoading();

    uni.navigateTo({
      url: `/pages/chat/red-packet-detail?id=${redPacketId}&type=${redPacketType}&data=${encodeURIComponent(
        JSON.stringify(result)
      )}`,
    });
  } catch (error) {
    hideLoading();
    showError("领取失败: " + (error.message || "未知错误"));
  }
};

/**
 * 处理消息气泡点击
 * @param {Object} data 点击数据
 * @param {Object} refs 组件引用对象
 * @param {Object} handlers 处理函数对象
 */
export const handleMessageBubbleTap = (data, refs, handlers) => {
  const { event, message } = data;
  const { musicPlayerRef } = refs;
  const { handleRedPacketClick } = handlers;

  try {
    // 获取点击位置
    const { x, y } = event.detail;

    // 使用uni.createSelectorQuery获取点击位置的元素
    const query = uni.createSelectorQuery();

    // 检查是否点击了音乐卡片
    query
      .selectAll(".music-card")
      .boundingClientRect((data) => {
        if (data) {
          // 查找点击位置所在的音乐卡片
          const clickedCard = data.find((card) => {
            return (
              x >= card.left &&
              x <= card.right &&
              y >= card.top &&
              y <= card.bottom
            );
          });

          if (clickedCard) {
            const musicId = clickedCard.id;
            const source = clickedCard.dataset.source;
            const title = clickedCard.dataset.musicTitle;
            const coverURL = clickedCard.dataset.musicCover;

            if (musicId && source) {
              const musicInfo = {
                id: musicId,
                title: title || "音乐分享",
                coverURL:
                  coverURL || "https://file.fishpi.cn/default-music-cover.png",
                source: source,
              };

              // 播放音乐
              if (musicPlayerRef.value) {
                musicPlayerRef.value.playMusic(musicInfo);
                return true;
              }
            }
          }
        }
        return false;
      })
      .exec();

    // 检查是否点击了红包卡片
    query
      .selectAll(".red-packet-card")
      .boundingClientRect((data) => {
        if (data && data.length > 0) {
          // 查找点击位置所在的红包卡片
          const clickedRedPacket = data.find((card) => {
            return (
              x >= card.left &&
              x <= card.right &&
              y >= card.top &&
              y <= card.bottom
            );
          });

          if (clickedRedPacket) {
            const redPacketId = clickedRedPacket.dataset.redpacketId;
            const redPacketType = clickedRedPacket.dataset.redpacketType;

            if (redPacketId) {
              // 处理红包点击
              handleRedPacketClick(redPacketId, redPacketType);
              return true;
            }
          }
        }
        return false;
      })
      .exec();
  } catch (error) {
    console.error("处理消息气泡点击错误:", error);
    return false;
  }
};

/**
 * 显示消息菜单
 * @param {Object} message 消息对象
 * @param {String} currentUser 当前用户
 * @returns {Object} 菜单样式对象
 */
export const calculateMenuPosition = (message, currentUser) => {
  if (!message) {
    console.error("calculateMenuPosition: 消息对象为空");
    return null;
  }

  console.log("计算菜单位置，消息ID:", message.oId);

  return new Promise((resolve) => {
    // 获取当前点击的消息元素位置
    const query = uni.createSelectorQuery();
    const selector = message.oId
      ? `#msg-${message.oId}`
      : `.message-item:nth-child(${message.index + 1})`;

    console.log("查询消息元素:", selector);

    query
      .select(selector)
      .boundingClientRect((res) => {
        if (res) {
          console.log("找到消息元素:", res);
          // 计算菜单位置
          const menuTop = res.top - 60;

          // 根据消息发送者调整菜单位置
          let menuLeft;
          const isSelf = message.userName === currentUser;

          if (isSelf) {
            // 自己发送的消息，菜单右对齐
            menuLeft = res.left + res.width - 300;
          } else {
            // 他人发送的消息，菜单左对齐
            menuLeft = res.left + 50;
          }

          // 设置菜单位置样式，确保不超出屏幕
          const style = {
            top: `${Math.max(30, menuTop)}px`,
            left: `${Math.max(10, menuLeft)}px`,
            zIndex: "10000", // 确保菜单在最上层
          };

          console.log("计算的菜单位置:", style);
          resolve(style);
        } else {
          console.error("未找到消息元素，选择器:", selector);
          // 尝试不同的查询方式
          query
            .selectAll(".message-item")
            .boundingClientRect((items) => {
              if (items && items.length > 0) {
                console.log("找到所有消息元素，总数:", items.length);

                // 找到大致索引位置的元素（如果是加载的历史消息）
                let targetItem = items[items.length - 1]; // 默认最后一个

                // 提供一个安全的位置，根据最后一个可见元素
                const style = {
                  top: `${targetItem.top - 60}px`,
                  left: `${targetItem.left + 40}px`,
                  zIndex: "10000",
                };

                console.log("使用备用位置:", style);
                resolve(style);
              } else {
                // 最终失败时使用固定位置
                console.error("未找到任何消息元素，使用固定位置");
                resolve({
                  top: "30%",
                  left: "40%",
                  zIndex: "10000",
                });
              }
            })
            .exec();
        }
      })
      .exec();
  });
};
